program es3;
{$mode tp}{$x-}

{------------------- CAPICUA --------------------------------------------------}
function exp(n,e:longint):longint;
begin
     if (e = 0) then exp := 1
     else exp := exp(n,e-1) * n;
end;

function inverso1(n:longint; var pos:integer):longint;
var inv:longint;
begin
     if (n div 10) = 0 then
        begin
             inverso1 := n;
             pos := 0
        end
     else
         begin
              inv := inverso1(n div 10,pos);
              pos := pos + 1;
              inverso1 := ((n mod 10) * exp(10,pos)) + inv;
         end;
end;

function inverso(n:longint):longint;
var p:integer;
begin
    inverso := inverso1(n,p);
end;

function escapicua(n:longint):boolean;
begin
    escapicua := (n = inverso(n));
end;

{------------------- PRIMO ----------------------------------------------------}

function esprimo1(n,divisor:longint):boolean;
begin
    if (divisor > (n div 2)) then
       esprimo1 := true
    else
       if (n mod divisor = 0) then
          esprimo1 := false
       else
          esprimo1 := esprimo1(n,divisor+1);
end;

function esprimo(n:longint):boolean;
begin
    esprimo := esprimo1(n,2);
end;

{------------------- MAXIMAL --------------------------------------------------}

procedure eliminar1(dig:longint; var n:longint);
// Versión con marcador
var actual:longint; // digito actual
begin
  actual := n mod 10;
  if (n >= 0) and (n <= 9) then
     begin
          if actual = dig then n := -1
     end
  else
     if actual = dig then
        n := n div 10     // elimino actual
     else
         begin
              n := n div 10;
              eliminar1(dig, n); // n viene actualizado
              if (n = -1) then
                 n := actual
              else
                 n := n*10 + actual;
         end;
end;

function menor(n:longint):longint;
var min: longint;
begin
  if (n div 10) = 0 then
     menor := n
  else
      begin
           min := menor(n div 10);
           if (n mod 10) < min then
              menor := (n mod 10)
           else
              menor := min
      end;
end;

function maximal(n: longint):longint;
var min, max: longint;
begin
  if (n div 10) = 0 then
     maximal := n
  else
     begin
          min := menor(n);
          eliminar1(min,n);
          max := maximal(n);   // n fue modificado en eliminar1
          maximal := (max * 10) + min;
     end;
end;

function esmaximal(n: longint):boolean;
begin
  esmaximal := (n = maximal(n));
end;

// Versión alternativa de esMaximal
// La idea es simplemente recorrer el nro fijadose que
// todos los digitos estén en orden descendente
function esmaximal2(n: longint):boolean;
begin
  if (n div 10) = 0 then
     esmaximal2 := true
  else
     if ((n div 10) mod 10) >= (n mod 10) then
        esmaximal2 := esmaximal2(n div 10)
     else
        esmaximal2 := false;
end;

{--------------------------------------------------------------------------}
var
  f:file of integer;
  cantmax, cantcap, cantprim: integer;
  n:integer;

begin
  assign(f,'enteros.dat');
  reset(f);
  cantmax := 0;
  cantcap := 0;
  cantprim := 0;

  while not eof(f) do
  begin
       read(f,n);
       write(n);
       if esprimo(n) then
          begin
               cantprim := cantprim + 1;
               write(', es primo');
          end;
       if escapicua(n) then
          begin
               cantcap := cantcap + 1;
               write(', es capicua');
          end;
       if esmaximal(n) then
          begin
               cantmax := cantmax + 1;
               write(', es maximal');
          end;
       writeln;
  end;
  writeln;
  writeln('La cantidad de primos es ',cantprim);
  writeln('La cantidad de capicuas es ',cantcap);
  writeln('La cantidad de maximales es ',cantmax);

  readln;
end.
